//You are playing the Bulls and Cows game with your friend. 
//
// You write down a secret number and ask your friend to guess what the number 
//is. When your friend makes a guess, you provide a hint with the following info: 
//
// 
// The number of "bulls", which are digits in the guess that are in the correct 
//position. 
// The number of "cows", which are digits in the guess that are in your secret 
//number but are located in the wrong position. Specifically, the non-bull digits 
//in the guess that could be rearranged such that they become bulls. 
// 
//
// Given the secret number secret and your friend's guess guess, return the 
//hint for your friend's guess. 
//
// The hint should be formatted as "xAyB", where x is the number of bulls and y 
//is the number of cows. Note that both secret and guess may contain duplicate 
//digits. 
//
// 
// Example 1: 
//
// 
//Input: secret = "1807", guess = "7810"
//Output: "1A3B"
//Explanation: Bulls are connected with a '|' and cows are underlined:
//"1807"
//  |
//"7810" 
//
// Example 2: 
//
// 
//Input: secret = "1123", guess = "0111"
//Output: "1A1B"
//Explanation: Bulls are connected with a '|' and cows are underlined:
//"1123"        "1123"
//  |      or     |
//"0111"        "0111"
//Note that only one of the two unmatched 1s is counted as a cow since the non-
//bull digits can only be rearranged to allow one 1 to be a bull.
// 
//
// Example 3: 
//
// 
//Input: secret = "1", guess = "0"
//Output: "0A0B"
// 
//
// Example 4: 
//
// 
//Input: secret = "1", guess = "1"
//Output: "1A0B"
// 
//
// 
// Constraints: 
//
// 
// 1 <= secret.length, guess.length <= 1000 
// secret.length == guess.length 
// secret and guess consist of digits only. 
// 
// Related Topics 哈希表 字符串 计数 👍 221 👎 0

package leetcode.editor.cn;

import org.junit.Assert;

import java.util.HashMap;
import java.util.Map;

public class P299BullsAndCows {
    public static void main(String[] args) {
        Solution solution = new P299BullsAndCows().new Solution();
        Assert.assertEquals(solution.getHint("1122", "1222"), "3A0B");
    }

    //leetcode submit region begin(Prohibit modification and deletion)
    class Solution {
        public String getHint(String secret, String guess) {
            int left = 0;
            int right = 0;
            int len = secret.length();
            Map<Character, Integer> exist = new HashMap<>();
            for (int i = 0; i < len; i++) {
                char a = guess.charAt(i);
                char b = secret.charAt(i);
                if (a == b) {
                    left++;
                }
                else{
                    exist.compute(b, (character, integer) -> {
                        return integer == null ? 1 : integer + 1;
                    });
                }
            }
            for (int i = 0; i < len; i++) {
                char a = guess.charAt(i);
                char b = secret.charAt(i);
                if (a != b) {
                    if (exist.containsKey(a) && exist.get(a) > 0) {
                        right++;
                        exist.compute(a, (character, integer) -> integer - 1);
                    }
                }

            }

            return left + "A" + right + "B";
        }
    }
//leetcode submit region end(Prohibit modification and deletion)

}